package com.usian.ai.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.usian.ai.common.Result;
import com.usian.ai.common.enums.ResultCodeEnum;
import com.usian.ai.common.exception.exception.StartTimeCannotAfterEndTimeException;
import com.usian.ai.mapper.InterviewerMapper;
import com.usian.ai.pojo.Interviewer;
import com.usian.ai.pojo.vo.InterviewerReqVo;
import com.usian.ai.pojo.vo.InterviewerSaveReqVo;
import com.usian.ai.pojo.vo.PageVo;
import com.usian.ai.service.InterviewerService;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @TODO:
 * @Author:baimu
 * @Date:2024 12 09 16 06
 **/

@Service
public class InterviewerServiceImpl
        extends ServiceImpl<InterviewerMapper, Interviewer>
        implements InterviewerService {
    /**
     * 分页查询面试官列表
     * 该方法用于获取经过分页处理的面试官信息列表，按照面试官ID进行降序排序
     *
     * @param interviewerReqVo 包含分页信息的对象，包括页码和每页大小
     * @return 返回分页后的面试官信息列表
     */
    @Override
    public Result listInterviewer(InterviewerReqVo interviewerReqVo) {
        // 创建分页对象，传入当前页码和每页大小
        Page<Interviewer> interviewerPage = new Page<>(interviewerReqVo.getPageNumber(), interviewerReqVo.getPageSize());

        // 创建查询条件对象，并设置排序条件为按照ID降序排序
        QueryWrapper<Interviewer> interviewerQueryWrapper = new QueryWrapper<>();

        // 根据传入的参数设置查询条件
        // 如果面试官名称不为空，则添加模糊查询条件
        interviewerQueryWrapper.lambda().like(StrUtil.isNotBlank(interviewerReqVo.getAiName()),Interviewer::getAiName,interviewerReqVo.getAiName());

        //添加创建时间的查询条件，如果开始时间为空，则使用1970年作为默认开始时间
        Date startTime = interviewerReqVo.getStartTime() != null ? interviewerReqVo.getStartTime() : DateUtil.parseDate("1970-01-01");
        //如果结束时间为空，则使用当前时间作为默认结束时间
        Date endTime = interviewerReqVo.getEndTime() != null ? interviewerReqVo.getEndTime() : new Date();

        // 判断开始时间是否大于结束时间，如果大于，则抛出异常
        if (startTime.after(endTime)) {
           throw  new StartTimeCannotAfterEndTimeException(ResultCodeEnum.START_TIME_CANNOT_AFTER_END_TIME);
        }
        interviewerQueryWrapper.lambda().between(Interviewer::getCreateTime, startTime, endTime);



        // 设置查询结果按照面试官ID降序排序
        interviewerQueryWrapper.lambda().orderByDesc(Interviewer::getId);

        // 执行分页查询，并返回查询结果
        Page<Interviewer> interviewerPage1 = this.baseMapper.selectPage(interviewerPage, interviewerQueryWrapper);
        return Result.ok(interviewerPage1);
    }

    @Override
    /**
     * 添加面试官信息
     *
     * @param interviewerReqVo 面试官保存请求对象，包含面试官的相关信息
     * @return 返回添加结果，包括受影响的行数
     *
     * 该方法的主要功能是将面试官的信息保存到数据库中
     * 它首先将请求对象中的信息转换为Interviewer对象，然后设置创建时间和更新时间，
     * 最后调用baseMapper的insert方法将对象插入到数据库中
     */
    public Result addInterviewer(InterviewerSaveReqVo interviewerReqVo) {

        // 检查面试官ID是否为空，以确定是插入新记录还是更新现有记录
        if(interviewerReqVo.getId()==null){
            // 创建Interviewer对象，并传入面试官的名字和图片
            Interviewer interviewer =
                    new Interviewer(interviewerReqVo.getAiName(), interviewerReqVo.getImage());
            // 设置时间戳
            Date now = new Date();
            // 设置创建时间
            interviewer.setCreateTime(now);
            // 设置更新时间
            interviewer.setUpdatedTime(now);
            // 调用baseMapper的insert方法，将Interviewer对象插入数据库
            int insert = this.baseMapper.insert(interviewer);
            // 返回操作结果
            return Result.ok(insert);
        }else{
            // 如果ID不为空，则创建Interviewer对象时包含ID，表示更新记录
            Interviewer interviewer =
                    new Interviewer(interviewerReqVo.getId(),interviewerReqVo.getAiName(), interviewerReqVo.getImage());
            // 设置时间戳
            Date now = new Date();
            // 设置更新时间
            interviewer.setUpdatedTime(now);

            // 调用baseMapper的updateById方法，根据ID更新Interviewer对象
            int i = this.baseMapper.updateById(interviewer);
            // 返回操作结果
            return Result.ok(i);
        }


    }
}
